package edu.asselvi.seguros.dao;

import java.sql.Connection; 
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import edu.asselvi.seguros.db.DbUtils;
import edu.asselvi.seguros.exception.ESegurosErros;
import edu.asselvi.seguros.exception.SegurosException;
import edu.asselvi.seguros.pojo.Contrato;


public class ContratoDao extends DbUtils {

	Connection conn = null;

	public ContratoDao(Connection conn) {
		this.conn = conn;
	}


	public Contrato insert(Contrato contrato) throws SegurosException {

		String sql = "INSERT INTO CONTRATOS (ID_CONTRATO, COMISSAO, STATUS, FK_ID_CLIENTE, FK_ID_CORRETOR, FK_ID_SEGURADORA) VALUES (?,?,?,?,?,?)";
		PreparedStatement p = null;

		try {
			p = conn.prepareStatement(sql);
			contrato.setId_contrato(getNextId("SEQ_CONTRATOS", conn));
			int cont = 1;

			p.setInt(cont++, contrato.getId_contrato());
			p.setDouble(cont++, contrato.getComissao());
			p.setBoolean(cont++, contrato.isStatus());
			p.setInt(cont++, contrato.getFk_id_cliente());
			p.setInt(cont++, contrato.getFk_id_corretor());
			p.setInt(cont++, contrato.getFk_id_seguradora());

			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_INSERCAO);

		} finally {
			close(p);
		}

		return contrato;
	}




	public List<Contrato> list() throws SQLException, SegurosException {

		String sql = "SELECT * FROM CONTRATOS";

		List<Contrato> lista = null;
		java.sql.ResultSet rs = null;
		PreparedStatement p = null;

		try {
			lista = new ArrayList<Contrato>();
			p = conn.prepareStatement(sql);
			rs = p.executeQuery();

			while (rs.next()) {
				Contrato contrato= new Contrato();

				contrato.setId_contrato(rs.getInt("ID_CONTRATO"));
				contrato.setData(rs.getDate("DATA"));
				contrato.setComissao(rs.getDouble("COMISSAO"));
				contrato.setStatus(rs.getBoolean("STATUS"));
				contrato.setFk_id_cliente(rs.getInt("FK_ID_CLIENTE"));
				contrato.setFk_id_corretor(rs.getInt("FK_ID_CORRETOR"));
				contrato.setFk_id_seguradora(rs.getInt("FK_ID_SEGURADORA"));

				lista.add(contrato);
			}

			if (lista.isEmpty()){
				throw new SegurosException(ESegurosErros.ERRO_ZERO_REGISTROS);
			} 

		} finally {
			close(p);
			close(rs);
		}
		return lista;
	}

	

	public void ativaContrato(Contrato contrato) throws SegurosException {

		String sql = "UPDATE CONTRATOS SET STATUS = ? WHERE ID_CONTRATO = ?";
		PreparedStatement p = null;

		try {
			p = conn.prepareStatement(sql);
			int cont = 1;

			p.setBoolean(cont++, contrato.isStatus());
			p.setInt(cont++, contrato.getId_contrato());

			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_DE_ATIVACAO);
			
		} finally {
			close(p);
		}
	}


	public Contrato getContrato(int id_contrato) throws SegurosException {

		String sql = "SELECT * FROM CONTRATOS WHERE ID_CONTRATO = ?";
		Contrato contrato = new Contrato();
		PreparedStatement p = null;
		ResultSet rs = null;
		
		try {
			p = conn.prepareStatement(sql);
			p.setInt(1, id_contrato);
			rs = p.executeQuery();

			while (rs.next()) {
				contrato.setId_contrato(rs.getInt("ID_CONTRATO"));
				contrato.setData(rs.getDate("DATA"));
				contrato.setComissao(rs.getDouble("COMISSAO"));
				contrato.setStatus(rs.getBoolean("STATUS"));
				contrato.setFk_id_cliente(rs.getInt("FK_ID_CLIENTE"));
				contrato.setFk_id_corretor(rs.getInt("FK_ID_CORRETOR"));
				contrato.setFk_id_seguradora(rs.getInt("FK_ID_SEGURADORA"));	
			}
			
		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_RECUPERAR_DADOS);
			
		} finally {
			close(p);
		}
		return contrato;		
	}
}
